home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / dev / gui / FoxGuiLibs.lha / DragDropTest.c next >
Encoding:
C/C++ Source or Header  |  1997-08-03  |  7.9 KB  |  276 lines

  1. /*****************************************************
  2.  * This source demonstrates how to use drag and      *
  3.  * drop to drag data between listboxes, frames and   *
  4.  * windows.  It should work on any Amiga.  On amigas *
  5.  * with Intuition V36 and above it will open a       *
  6.  * screen with the same screen mode as your WB       *
  7.  * screen.  The program, when compiled and linked    *
  8.  * can be run from the WB or a shell with a stack    *
  9.  * size of about 40k.                                *
  10.  ****************************************************/
  11.  
  12. /*
  13.  * To compile with SAS/C type:
  14.  * sc UNSCHAR STRMERGE StructureEquivalence DragDropTest
  15.  * Then link as follows:
  16.  * slink from LIB:c.o+DragDropTest.o to DragDropTest lib FoxLib:FoxGui.lib+LIB:scm.lib+LIB:sc.lib+LIB:amiga.lib
  17.  */
  18.  
  19. #include <stdlib.h>
  20. #include <clib/intuition_protos.h>
  21. #include <clib/graphics_protos.h>
  22. #include <string.h>
  23. #include <exec/memory.h>
  24.  
  25. #include "foxinclude/FoxGui.h"
  26.  
  27. GuiScreen *gscreen;
  28. GuiWindow *gw1, *gw2;
  29. Frame *frame1, *frame2;
  30. ListBox *lb1;
  31. struct TextAttr pub_screen_font;
  32. struct TextFont *opened_font;
  33.  
  34. void FreeRMScreenBits(void)
  35.     {
  36.     if (opened_font)
  37.         {
  38.         CloseFont(opened_font);
  39.         opened_font = NULL;
  40.         }
  41.     if (pub_screen_font.ta_Name)
  42.         {
  43.         GuiFree(pub_screen_font.ta_Name);
  44.         pub_screen_font.ta_Name = NULL;
  45.         }
  46.     }
  47.  
  48. static GuiScreen *cloneScreen(UBYTE *pub_screen_name)
  49.     {
  50.     GuiScreen *retval = NULL;
  51.     ULONG  screen_modeID;
  52.     UBYTE *pub_scr_font_name;
  53.     struct Screen   *pub_screen = NULL;
  54.     struct DrawInfo *screen_drawinfo = NULL;
  55.  
  56.     // name is a (UBYTE *) pointer to the name of the public screen to clone
  57.     pub_screen = LockPubScreen(pub_screen_name);
  58.     if (pub_screen != NULL)
  59.         {
  60.         // Get the DrawInfo structure from the locked screen.  This returns pen, depth and font info.
  61.         screen_drawinfo = GetScreenDrawInfo(pub_screen);
  62.         if (screen_drawinfo != NULL)
  63.             {
  64.             screen_modeID = GetVPModeID(&(pub_screen->ViewPort));
  65.             if( screen_modeID != INVALID_ID )
  66.                 {
  67.             /* Get a copy of the font.  The name of the font must be copied as the public screen may go
  68.                     away at any time after we unlock it.  Allocate enough memory to copy the font name, create
  69.                     a TextAttr that matches the font, and open the font. */
  70.                 pub_scr_font_name = screen_drawinfo->dri_Font->tf_Message.mn_Node.ln_Name;
  71.                 pub_screen_font.ta_Name = GuiMalloc((strlen(pub_scr_font_name) + 1) * sizeof(char), MEMF_CLEAR);
  72.                 if (pub_screen_font.ta_Name != NULL)
  73.                     {
  74.                     strcpy(pub_screen_font.ta_Name, pub_scr_font_name);
  75.                     pub_screen_font.ta_YSize = screen_drawinfo->dri_Font->tf_YSize;
  76.                     pub_screen_font.ta_Style = screen_drawinfo->dri_Font->tf_Style;
  77.                     pub_screen_font.ta_Flags = screen_drawinfo->dri_Font->tf_Flags;
  78.  
  79.                     opened_font = OpenFont(&pub_screen_font);
  80.                     if (opened_font != NULL)
  81.                         {
  82.                         /* screen_modeID may now be used in a call to OpenScreenTagList() with the tag
  83.                             SA_DisplayID. */
  84.                         retval = OpenGuiScreen(screen_drawinfo->dri_Depth, 2, 1,
  85.                                 &pub_screen_font, "Drag-drop Test", NULL, GS_AUTOSCROLL |
  86.                                 GS_DISPLAY_ID | GS_OVERSCAN | GS_PENS, screen_modeID, OSCAN_TEXT,
  87.                                 screen_drawinfo->dri_Pens);
  88.                         if (retval)
  89.                             SetGuiPens(screen_drawinfo->dri_Pens[SHINEPEN], screen_drawinfo->dri_Pens[SHADOWPEN]);
  90.                         else
  91.                             /*    This way we can check whether the WB screen was cloned from anywhere in the code
  92.                                 by checking the value of opened_font */
  93.                             FreeRMScreenBits();
  94.                         }
  95.                     }
  96.                 }
  97.             }
  98.         }
  99.  
  100.     // Free the drawinfo and public screen as we don't need them any more.  We now have our own screen.
  101.     if (screen_drawinfo)
  102.         FreeScreenDrawInfo(pub_screen,screen_drawinfo);
  103.     if (pub_screen)
  104.         UnlockPubScreen(pub_screen_name,pub_screen);
  105.  
  106.     return retval;
  107.     }
  108.  
  109. void CleanUp(void)
  110. {
  111.     FreeRMScreenBits();
  112.     EndGui();
  113.     exit(0);
  114. }
  115.  
  116. int CloseWinFn(GuiWindow *w)
  117. {
  118.     return GUI_END;
  119. }
  120.  
  121. int WinDropFn(GuiWindow *w, int x, int y, void *DragData)
  122. {
  123.     char text[100];
  124.     sprintf(text, "From: %s", DragData);
  125.     AddListBoxItem(lb1, text, TRUE);
  126.     sprintf(text, "To:   Window %d at %3d, %3d", w == gw1 ? 1 : 2, x, y);
  127.     AddListBoxItem(lb1, text, TRUE);
  128.     return GUI_CONTINUE;
  129. }
  130.  
  131. char DragText[100];
  132.  
  133. int Frame1Fn(Frame *fm, short action, short x, short y, void **DragData)
  134. {
  135.     if (action == FM_RBUT)
  136.     {
  137.         char message[100];
  138.         sprintf(message, "RClick in Frame 1 at %3d, %3d", x, y);
  139.         AddListBoxItem(lb1, message, TRUE);
  140.     }
  141.     else if (action == FM_DRAG)
  142.     {
  143.         sprintf(DragText, "Frame 1  at %3d, %3d", x, y);
  144.         *DragData = DragText;
  145.     }
  146.     else if (action == FM_DROP)
  147.     {
  148.         char text[100];
  149.         sprintf(text, "From: %s", *DragData);
  150.         AddListBoxItem(lb1, text, TRUE);
  151.         sprintf(text, "To:   Frame 1  at %3d, %3d", x, y);
  152.         AddListBoxItem(lb1, text, TRUE);
  153.     }
  154.     else if (action == FM_LBUT)
  155.     {
  156.         char message[100];
  157.         sprintf(message, "LClick in Frame 1 at %3d, %3d", x, y);
  158.         AddListBoxItem(lb1, message, TRUE);
  159.     }
  160.     return GUI_CONTINUE;
  161. }
  162.  
  163. int Frame2Fn(Frame *fm, short action, short x, short y, void **DragData)
  164. {
  165.     if (action == FM_RBUT)
  166.     {
  167.         char message[100];
  168.         sprintf(message, "RClick in Frame 2 at %3d, %3d", x, y);
  169.         AddListBoxItem(lb1, message, TRUE);
  170.     }
  171.     else if (action == FM_DRAG)
  172.     {
  173.         sprintf(DragText, "Frame 2  at %3d, %3d", x, y);
  174.         *DragData = DragText;
  175.     }
  176.     else if (action == FM_DROP)
  177.     {
  178.         char text[100];
  179.         sprintf(text, "From: %s", *DragData);
  180.         AddListBoxItem(lb1, text, TRUE);
  181.         sprintf(text, "To:   Frame 2  at %3d, %3d", x, y);
  182.         AddListBoxItem(lb1, text, TRUE);
  183.     }
  184.     else if (action == FM_LBUT)
  185.     {
  186.         char message[100];
  187.         sprintf(message, "LClick in Frame 2 at %3d, %3d", x, y);
  188.         AddListBoxItem(lb1, message, TRUE);
  189.     }
  190.     return GUI_CONTINUE;
  191. }
  192.  
  193. int LBeventfn(ListBox *lb, short Event, int lbitemnum, void **EventData)
  194. {
  195.     char ItemNumStr[20];
  196.  
  197.     if (lbitemnum)
  198.         sprintf(ItemNumStr, "(item %d)", lbitemnum);
  199.     else
  200.         sprintf(ItemNumStr, "(No Item)");
  201.  
  202.     if (Event == LB_DROP && *EventData)
  203.     {
  204.         char text[100];
  205.         sprintf(text, "From: %s", *EventData);
  206.         AddListBoxItem(lb, text, TRUE);
  207.         sprintf(text, "To:   List Box %s", ItemNumStr);
  208.         AddListBoxItem(lb, text, TRUE);
  209.     }
  210.     else if (Event == LB_DRAG)
  211.     {
  212.         sprintf(DragText, "List Box %s", ItemNumStr);
  213.         *EventData = DragText;
  214.     }
  215.     return GUI_CONTINUE;
  216. }
  217.  
  218. void main(void)
  219. {
  220.     short IntuitionVersion = InitGui(FAST_MALLOCS, NULL);
  221.  
  222.     if (IntuitionVersion == 0)
  223.         return;
  224.  
  225.     /* Open a FoxGui screen using the same screen mode as the current workbench screen if possible */
  226.  
  227.     if (IntuitionVersion >= 36) // Screen cloning only works with intuition V36 or greater.
  228.         gscreen = cloneScreen("Workbench");
  229.     else
  230.         gscreen = OpenGuiScreen(2, 2, 1, NULL, "Drag-drop Test", NULL, GS_AUTOSCROLL);
  231.         
  232.     if (!gscreen)
  233.         CleanUp();
  234.  
  235.     /* Open a couple of windows */
  236.  
  237.     gw1 = OpenGuiWindow(gscreen, 0, 10, 320, 235, 0, 0, 8, 2, 6, "Window 1", GW_DRAG | GW_DEPTH | GW_SIZE | GW_CLOSE | GW_DROP, CloseWinFn, WinDropFn);
  238.     if (!gw1)
  239.     {
  240.         CloseGuiScreen(gscreen);
  241.         CleanUp();
  242.     }
  243.     gw2 = OpenGuiWindow(gscreen, 320, 10, 320, 235, 0, 0, 8, 2, 6, "Window 2", GW_DRAG | GW_DEPTH | GW_SIZE | GW_DROP | GW_CONSOLE, NULL, WinDropFn);
  244.     if (!gw2)
  245.     {
  246.         CloseGuiWindow(gw1);
  247.         CloseGuiScreen(gscreen);
  248.         CleanUp();
  249.     }
  250.  
  251.     /* Window gw2 has a console so it will get an unsightly cursor unless we hide it! */
  252.     WinHideCursor(gw2);
  253.     WinPrintTab(gw2, 1, 15, "Try dragging data:");
  254.     WinPrintTab(gw2, 3, 16, "From one frame to another,");
  255.     WinPrintTab(gw2, 3, 17, "From a frame to the list box,");
  256.     WinPrintTab(gw2, 3, 18, "From the list box to a frame,");
  257.     WinPrintTab(gw2, 3, 19, "From a frame to a window,");
  258.     WinPrintTab(gw2, 3, 20, "From the list box to a window.");
  259.  
  260.     /* Create a frame in each window and a list box in which to list the drag/drop and button
  261.         events. */
  262.  
  263.     frame1 = MakeFrame(gw1, "Frame 1", 20, 30, 260, 40, 1, 1, NULL, Frame1Fn, FM_CLEAR | FM_DRAG | FM_DROP | FM_RBUT | FM_LBUT);
  264.     frame2 = MakeFrame(gw2, "Frame 2", 20, 30, 260, 40, 1, 1, NULL, Frame2Fn, FM_CLEAR | FM_DRAG | FM_DROP | FM_RBUT | FM_LBUT);
  265.     lb1 = MakeListBox(gw1, 20, 90, 260, 100, 2, 1, 1, NULL, NULL, LB_DRAG | LB_DROP, LBeventfn);
  266.     if (lb1)
  267.         AddListBoxTitle(lb1, "Event List:", 1, TRUE);
  268.  
  269.     GuiLoop();
  270.  
  271.     CloseGuiWindow(gw2);
  272.     CloseGuiWindow(gw1);
  273.     CloseGuiScreen(gscreen);
  274.     CleanUp();
  275. }
  276.